/* Copyright (c) 2024 Huawei Technologies Co., Ltd.
 * This file is a part of the CANN Open Software.
 * Licensed under CANN Open Software License Agreement Version 1.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 * ===================================================================================================================*/

#include <gtest/gtest.h>
#include "graph/ascend_string.h"

namespace ge
{
  class UtestAscendString : public testing::Test {
    protected:
    void SetUp() {}
    void TearDown() {}
  };

  TEST_F(UtestAscendString, OperatorLess_success) {
    AscendString strcmp1(nullptr);
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp_");

    ASSERT_EQ(strcmp1 < strcmp2, false);
    ASSERT_EQ(strcmp1 < strcmp3, true);
    ASSERT_EQ(strcmp3 < strcmp2, false);
    ASSERT_EQ(strcmp3 < strcmp4, true);
  }

  TEST_F(UtestAscendString, OperatorGreater_success) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp_");

    ASSERT_EQ(strcmp1 > strcmp2, false);
    ASSERT_EQ(strcmp1 > strcmp3, false);
    ASSERT_EQ(strcmp3 > strcmp2, true);
    ASSERT_EQ(strcmp4 > strcmp3, true);
  }

  TEST_F(UtestAscendString, OperatorEqual_success) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp");
    AscendString strcmp5("strcmp_");

    ASSERT_EQ(strcmp1 == strcmp2, true);
    ASSERT_EQ(strcmp1 == strcmp3, false);
    ASSERT_EQ(strcmp3 == strcmp2, false);
    ASSERT_EQ(strcmp4 == strcmp3, true);
    ASSERT_EQ(strcmp4 == strcmp5, false);
  }

  TEST_F(UtestAscendString, OperatorLess_Equal_success) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp");
    AscendString strcmp5("strcmp_");

    ASSERT_EQ(strcmp1 <= strcmp2, true);
    ASSERT_EQ(strcmp3 <= strcmp2, false);
    ASSERT_EQ(strcmp4 <= strcmp3, true);
    ASSERT_EQ(strcmp5 <= strcmp3, false);
  }

  TEST_F(UtestAscendString, OperatorGreater_Equal_success) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp");
    AscendString strcmp5("strcmp_");

    ASSERT_EQ(strcmp1 >= strcmp2, true);
    ASSERT_EQ(strcmp1 >= strcmp3, false);
    ASSERT_EQ(strcmp3 >= strcmp2, true);
    ASSERT_EQ(strcmp4 >= strcmp3, true);
    ASSERT_EQ(strcmp5 >= strcmp3, true);
  }

  TEST_F(UtestAscendString, OperatorUnequal_success) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp_");

    ASSERT_EQ(strcmp1 != strcmp2, false);
    ASSERT_EQ(strcmp1 != strcmp3, true);
    ASSERT_EQ(strcmp3 != strcmp2, true);
    ASSERT_EQ(strcmp4 != strcmp3, true);
  }

  TEST_F(UtestAscendString, OperatorEqual_char) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp");
    AscendString strcmp5("strcmp_");

    ASSERT_EQ(strcmp1 == nullptr, true);
    ASSERT_EQ(strcmp1 == "strcmp", false);
    ASSERT_EQ(strcmp3 == nullptr, false);
    ASSERT_EQ(strcmp4 == "strcmp", true);
    ASSERT_EQ(strcmp4 == "strcmp_", false);
    ASSERT_EQ(strcmp5 == "strcmp", false);
  }

  TEST_F(UtestAscendString, OperatorUnequal_char_success) {
    AscendString strcmp1 = nullptr;
    AscendString strcmp2 = nullptr;
    AscendString strcmp3("strcmp");
    AscendString strcmp4("strcmp_");

    ASSERT_EQ(strcmp1 != nullptr, false);
    ASSERT_EQ(strcmp1 != "strcmp", true);
    ASSERT_EQ(strcmp3 != nullptr, true);
    ASSERT_EQ(strcmp4 != "strcmp", true);
  }

  TEST_F(UtestAscendString, with_length) {
    size_t trunk_size = strlen("strcmp");
    AscendString strcmp1("strcmp1", trunk_size);
    AscendString strcmp2("strcmp2", trunk_size);
    AscendString strcmp3("strcmp1");
    ASSERT_EQ(strcmp1.GetLength(), trunk_size);
    ASSERT_EQ(strcmp2.GetLength(), trunk_size);
    ASSERT_GT(strcmp3.GetLength(), trunk_size);
    ASSERT_TRUE(strcmp1 == strcmp2);
    ASSERT_FALSE(strcmp1 == strcmp3);
  }

  TEST_F(UtestAscendString, null_size) {
    AscendString strcmp1(nullptr, 1);
    ASSERT_EQ(strcmp1.GetLength(), 0);
  }

  TEST_F(UtestAscendString, with_terminal) {
    std::string with_terminal_str("abc\0def", 7);
    AscendString with_terminal("abc\0def", 7);
    AscendString without_terminal("abc\0def");
    ASSERT_EQ(with_terminal.GetLength(), with_terminal_str.length());
    ASSERT_GT(with_terminal.GetLength(), without_terminal.GetLength());
    std::string re_build_str(with_terminal.GetString(), with_terminal.GetLength());
    ASSERT_EQ(re_build_str, with_terminal_str);
  }
}
